package com.laity.tvolatile;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.tvolatile.VDemo01
 * @Date: 2023年12月13日 16:28
 * @Description: volatile 不保证原子性
 * 总线嗅探机制：
 * 1. 总线嗅探机制是一种特殊的指令，它会在CPU执行指令时，检查总线上是否有其他CPU正在执行指令，如果有，则CPU会暂停执行，直到其他CPU完成指令。
 */

public class VDemo01 {

    private static volatile AtomicInteger count = new AtomicInteger(0);

    // synchronized保证原子性
    public static void add() {
        count.getAndIncrement();  // AtomicInteger + 1 方法，CAS
    }

    public static void main(String[] args) {
        // 理论上，count 应该是 10000，但是实际上可能是 9999，因为有可能有其他线程正在执行 add 方法，导致 count 不是 10000
        for (int i = 0; i < 10000; i++) {
            new Thread(VDemo01::add).start();
        }
        while (Thread.activeCount() > 2) {
            // 让其他线程执行
            // yield是让当前线程让出CPU执行权，让其他线程有机会执行
            Thread.yield();
        }

        // while (count < 10000) { }
        System.out.println(count);
    }

}
